package com.skyyan.netty.jjf.util;

import java.nio.charset.StandardCharsets;
import java.util.Arrays;

/**
 * 使用 UTF-8 编码
 * 每个汉字占 3 个字节
 * 总字节数不能超过 12 字节
 * 如果不足 12 字节，则在末尾补 0x00（右填充）
 * 最终得到一个 固定 12 字节的 byte[] 数组
 * @author skyyan
 */
public class FixedLengthUtf8Encoder {

    private static final int MAX_BYTES = 12; // 最大 12 字节
    private static final int BYTES_PER_CHAR = 3; // UTF-8 中文每个字 3 字节

    /**
     * 将中文字符串编码为 12 字节的 UTF-8 数组，不足补 0x00
     *
     * @param str 输入字符串（只能是 UTF-8 中文，每个字 3 字节）
     * @return 固定 12 字节的数组
     * @throws IllegalArgumentException 如果超长或包含非 3 字节字符
     */
    public static byte[] encodeTo12Bytes(String str)throws Exception {
        if (str == null) {
            str = "";
        }

        // 1. 转为 UTF-8 字节
        byte[] utf8Bytes = str.getBytes(StandardCharsets.UTF_8);

        // 2. 验证每个字符是否都是 3 字节（常用中文）
        if (!isValidUtf8Chinese(utf8Bytes, str.length())) {
            throw new Exception("字符串必须由 UTF-8 3 字节中文组成，且不能包含英文、数字、符号等");
        }

        // 3. 检查长度：最多 4 个汉字（4 * 3 = 12 字节）
        if (str.length() > 4) {
            throw new Exception("最多只能有 4 个汉字（12 字节），当前输入：" + str.length() + " 个字");
        }

        // 4. 创建 12 字节数组，初始化为 0x00
        byte[] result = new byte[MAX_BYTES];
        Arrays.fill(result, (byte) 0x00);

        // 5. 复制 UTF-8 字节到前面
        System.arraycopy(utf8Bytes, 0, result, 0, utf8Bytes.length);

        return result;
    }

    /**
     * 验证是否为标准的 UTF-8 3 字节中文（基本汉字）
     */
    private static boolean isValidUtf8Chinese(byte[] bytes, int charCount) {
        int expectedLength = charCount * BYTES_PER_CHAR;
        if (bytes.length != expectedLength) {
            return false;
        }

        // 检查每 3 字节是否为标准中文 UTF-8 格式
        for (int i = 0; i < bytes.length; i += 3) {
            if (i + 2 >= bytes.length) break;
            byte b1 = bytes[i];
            byte b2 = bytes[i + 1];
            byte b3 = bytes[i + 2];

            // UTF-8 中文：1110xxxx 10xxxxxx 10xxxxxx
            if ((b1 & 0xE0) != 0xE0 || (b2 & 0xC0) != 0x80 || (b3 & 0xC0) != 0x80) {
                return false;
            }
        }
        return true;
    }

    // ---------------- 测试 ----------------
    public static void main(String[] args) throws Exception{
        // 测试用例
        test("张");      // 3 字节 + 9 个 0x00
        test("张三");    // 6 字节 + 6 个 0x00
        test("张三李");  // 9 字节 + 3 个 0x00
        test("张三李四"); // 12 字节，不补 0
        test("张三李四五"); // 超长，应报错
        test("abc");     // 非中文，应报错
    }

    private static void test(String input)throws Exception {
            byte[] encoded = encodeTo12Bytes(input);
            System.out.println("输入: \"" + input + "\" → Hex: " + bytesToHex(encoded));

    }

    // Hex 转换工具（用于打印）
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b & 0xFF));
        }
        return sb.toString();
    }
}
